package com.wkbb.basic.service;

import com.github.pagehelper.PageInfo;
import com.wkbb.basic.model.*;
import com.wkbb.common.base.BaseService;
import com.wkbb.common.constants.ErrorCode;
import com.wkbb.common.dto.basic.EmployeeInfoDto;
import com.wkbb.common.dto.basic.RoleTypeJsonDto;
import com.wkbb.common.dto.basic.UserDto;
import com.wkbb.common.dto.basic.UserInfoDto;
import com.wkbb.common.enums.UserStatRoleTypeEnum;
//import com.wkbb.common.vo.DeviceUserVo;

import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public interface UserService extends BaseService<User> {

    EmployeeInfoDto getEmloyeeByPwd(String account, String password);
    /**
     * @param roleTypeJson 要新增roleType的时候传
     * @param oldRoleType  要删除旧的roleType的时候传
     * @param roleType     要新增roleType的时候传
     * @param oldOrgId     要删除旧的RoleType的时候传
     * @param orgId        要新增roleType的时候传
     * @return 处理过的roleType
     */
    List<RoleTypeJsonDto> updateRoleTypeJson(Object roleTypeJson, Short oldRoleType, Short roleType, Long oldOrgId, Long orgId , Long  userId);

    void updateRedisTemplate(Long orgId, Long userId, Integer roleType, Object roleTypeObject);

    void updateUserInfo(Long orgId, Long userId);

    void deleteUserInfo(Long orgId, Long userId, Integer roleType) throws Exception;

    User getUserByMobile(String mobile);

    UserInfoDto getUserInfoByMobile(String mobile);


    /**
     * 查询用户详情信息
     * @param params userId
     * @return 用户详情
     */
    UserInfoDto getUserInfoById(Map<String,Object> params);

    /**
     * 检查用户手机号
     *
     * @param mobile 手机号码
     * @param userId 用户ID
     * @return 检查结果
     */
    int checkMobile(String mobile, Long userId);

    /**
     * 检查用户手机号并返回错误码
     *
     * @param mobile   手机号码
     * @param cardNo   卡号
     * @param jobNo    教工号
     * @param userId   用户ID
     * @param roleType 角色类型
     * @param orgId    组织ID
     * @param account  登录后台账号
     * @return 检查结果错误码
     */
    //ErrorCode checkMobileErrorCode(String mobile, String cardNo, String jobNo, Long userId, Integer roleType, Long orgId, String account) throws Exception;

    ErrorCode checkMobileErrorCode(String mobile, String cardNo, String jobNo, Long userId, Integer roleType, Long orgId, String account,Long classId) throws Exception;
    /**
     * 检查用户手机号并返回错误码
     *
     * @param mobile   手机号码
     * @param cardNo   卡号
     * @param jobNo    教工号
     * @param userId   用户ID
     * @param roleType 角色类型
     * @param orgId
     * @return 检查结果错误码
     */
   // ErrorCode checkMobileErrorCode(String mobile, String cardNo, String jobNo, Long userId, Integer roleType, Long orgId) throws Exception;
    
    
    ErrorCode checkMobileErrorCode(String mobile, String cardNo, String jobNo, Long userId, Integer roleType, Long orgId,Long classId) throws Exception;
    

    List<UserDto> loginByPwd(String account, String password);

    UserDto getUserInfo(Boolean routeFlag,Long accountId, Long orgId, Long userId);

    /**
     * 后台取用户登录数据
     */
    UserDto getUserInfoManage(Long accountId, Long orgId, Long userId, Boolean isAll);

    UserInfoDto getUserInfoByUser(Long orgId, Long userId, Integer roleType);

    void insert(Long orgId, User user, int roleType, String sex,Short userType,String smartWxUserId,Boolean isSmartSubscribe);

    /**
     * 更新用户信息
     *
     * @param orgId
     * @param user     用户信息
     * @param roleType
     * @param isBack   是否后台操作
     * @throws Exception 抛出异常
     */
    void update(Long orgId, User user, int roleType, boolean isBack,String smartWxUserId,Boolean isSmartSubscribe) throws Exception;

    /**
     * 通过设备编号获取用户列表
     *
     * @param orgId    学校ID
     * @param roleType 1教师 2家长 3学生 4职员 5游客
     * @param userId 用户ID
     * @param date 当前时间
     * @return 用户列表
     */
   // List<DeviceUserVo> getUserByDeviceOrg(Long orgId, Long userId, String roleType, Date date);

    UserOpen getUserOpenByUser(Map<String, Object> params);

    void addUserLoginLog(UserLoginLog userLoginLog);

    UserLastLogin getUserLastLogin(Map<String, Object> params);

    void addUserLastLogin(UserLastLogin userLastLogin);

    void updateUserLastLogin(UserLastLogin userLastLogin);

    void updateUserLastLoginStatus(Map<String, Object> params);

    User getNewUserByOld(Long orgId, Integer roleType, Long oldUserId);

    Boolean checkCardNo(String cardNo,Long orgId);

    /**
     * 检测卡号是否存在
     * @param cardNo 卡号
     * @param orgId 学校
     * @param userList 已存在用户
     * @return 是否存在
     */
    Boolean checkCardNo(String cardNo, Long orgId, List<Long> userList);

    int checkJobNo(String jobNo, Long userId, Integer roleType, Long orgId,Long classId);

    UserInfoDto checkMobileUnique(Long orgId, String mobile,Integer roleType);

    User checkUserMobile(String mobile);

    Boolean checkCardNoUnique(String cardNo,Long orgId);
	
    void deleteUserData(Long orgId);

    void repairUserSmart(Long orgId, Long userId,String smartWxUserId,Boolean isSmartSubscribe,Integer roleType);

    /**
     * 获取智慧校园用户微信号
     * @param orgId
     * @param userId
     * @return
     */
    UserSmart getUserSmart(Long orgId, Long userId, Integer roleType);

    /**
     * 按角色统计学校用户数据(全校、年级、班级)
     * */
    Integer getUserCount(UserStatRoleTypeEnum userStatRoleType, Long orgId, Long gradeId, Long classId);

    /**
     * 删除前端用户缓存
     * @return
     */
    void deleteRedisWkbbBasicUserBack(Long userId,Long orgId);

    boolean clearBindUser(Long orgId,String mobile);

    boolean clearBindUserByAccount(Long accountId,String unionId);

    boolean clearBindUserByMobile(String mobile);

    void clearOrgBindUser(Long orgId);

    void clearUserLoginRedis(Boolean routeFlag,Long orgId,Long userId,String unionId);

    /**
     * 获取图片md5值
     *
     * @param url
     * @return
     */
    public String getImageMD5(String url);

    PageInfo<UserDto> getAppletUserPageList(HashMap<String, Object> params, Integer pageNo, Integer pageSize);
}
